#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>

typedef long long ll;
using pair = std::pair<ll, int>;
using std::min;

ll const inf = 0x3f3f3f3f3f3f3f3f;
int const N = 2e5 + 5, bit = 20;
int n, m, q;
int heads[N], e_cnt = 1, id[N], p_cnt = 0;
int from[N], h[N], f[bit][N], dep[N];
bool on[N];
ll dis[N], ndis[N], val[N << 2];

struct Edge {
  int v, nxt, w;
} e[N << 1];

inline void add(int u, int v, int w) {
  e[++e_cnt].v = v, e[e_cnt].nxt = heads[u], heads[u] = e_cnt, e[e_cnt].w = w;
}

std::priority_queue<pair, std::vector<pair>, std::greater<pair> > pq;

inline void Dijkstra(int s, ll (&dis)[N]) {
  memset(dis, 0x3f, sizeof(dis));
  dis[s] = 0, from[s] = 0;
  pq.emplace(0, s);
  while (!pq.empty()) {
    int u = pq.top().second;
    ll d = pq.top().first;
    pq.pop();
    if (dis[u] != d) continue;
    for (int i = heads[u], v; i; i = e[i].nxt)
      if (dis[v = e[i].v] > dis[u] + e[i].w) {
        dis[v] = dis[u] + e[i].w, from[v] = i;
        pq.emplace(dis[v], v);
      }
  }
}

inline void getDisTree() {
  for (int i = 1; i <= n; ++i) h[i] = i;
  std::sort(h + 1, h + n + 1,
            [](const int &lhs, const int &rhs) { return dis[lhs] < dis[rhs]; });
  for (int i = 1, x; i <= n; ++i) {
    x = h[i];
    f[0][x] = e[from[x] ^ 1].v;
    if (x == 1) f[0][x] = 1;
    dep[x] = dep[f[0][x]] + 1;
    for (int j = 1; j < bit; ++j) f[j][x] = f[j - 1][f[j - 1][x]];
  }
}

inline void solve() {
  h[0] = 0;
  for (int x = n; x != 1; x = e[from[x] ^ 1].v) {
    on[from[x] >> 1] = true;
    h[++h[0]] = e[from[x] ^ 1].v;
  }
  for (int i = h[0]; i >= 1; --i) id[h[i]] = ++p_cnt;
  id[n] = p_cnt + 1;
}

inline int lca(int x, int y) {
  if (dep[x] < dep[y]) std::swap(x, y);
  for (int j = bit - 1; ~j; --j)
    if (dep[f[j][x]] >= dep[y]) x = f[j][x];
  if (x == y) return x;
  for (int j = bit - 1; ~j; --j)
    if (f[j][x] != f[j][y]) x = f[j][x], y = f[j][y];
  return f[0][x];
}

void modify(int x, int l, int r, int L, int R, ll v) {
  if (L <= l && r <= R) return val[x] = min(val[x], v), void();
  if (val[x] <= v) return;
  int mid = (l + r) >> 1;
  if (L <= mid) modify(x << 1, l, mid, L, R, v);
  if (R > mid) modify(x << 1 | 1, mid + 1, r, L, R, v);
}

ll query(int x, int l, int r, int k) {
  if (l == r) return val[x];
  int mid = (l + r) >> 1;
  if (k <= mid) return min(val[x], query(x << 1, l, mid, k));
  else
    return min(val[x], query(x << 1 | 1, mid + 1, r, k));
}

int main() {
#ifndef ONLINE_JUDGE
#ifdef LOCAL
  freopen("testdata.in", "r", stdin);
  freopen("testdata.out", "w", stdout);
#else
  freopen("CF1163F Indecisive Taxi Fee.in", "r", stdin);
  freopen("CF1163F Indecisive Taxi Fee.out", "w", stdout);
#endif
#endif

  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1, u, v, w; i <= m; ++i) {
    scanf("%d%d%d", &u, &v, &w);
    add(u, v, w);
    add(v, u, w);
  }
  Dijkstra(1, dis);
  getDisTree();
  solve();
  Dijkstra(n, ndis);
  memset(val, 0x3f, sizeof(val));
  for (int i = 1; i <= m; ++i) {
    if (on[i]) continue;
    int u = e[i << 1].v, v = e[i << 1 | 1].v;
    ll tmp = min(dis[u] + ndis[v], dis[v] + ndis[u]) + e[i << 1].w;
    u = lca(u, n);
    v = lca(v, n);
    if (u == v) continue;
    if (id[u] > id[v]) std::swap(u, v);
    modify(1, 1, p_cnt, id[u], id[v] - 1, tmp);
  }
  for (int i = 1, t, x; i <= q; ++i) {
    scanf("%d%d", &t, &x);
    int u = e[t << 1].v, v = e[t << 1 | 1].v;
    if (on[t]) {
      ll ans = min(dis[u] + ndis[v], dis[v] + ndis[u]) + x;
      if (x <= e[t << 1].w) printf("%lld\n", ans);
      else {
        if (id[u] > id[v]) std::swap(u, v);
        ans = min(ans, query(1, 1, p_cnt, id[u]));
        printf("%lld\n", ans);
      }
    } else {
      ll ans = dis[n];
      if (x <= e[t << 1].w)
        ans = min(dis[n], min(dis[u] + ndis[v], dis[v] + ndis[u]) + x);
      printf("%lld\n", ans);
    }
  }
  return 0;
}